﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Xml;
using System.Xml.Serialization;
using System.Runtime.Serialization.Formatters.Soap;
using System.IO;
using MainScene;
using MindFusion.Diagramming.WinForms;
using MindFusion.Diagramming;
using System.Runtime.Serialization.Formatters.Binary;


namespace SSShell
{
    public partial class frmMain : Form
    {
        public frmMain()
        {
            InitializeComponent();
            //ошибка из-за уже использованного ключа IconNode
            //MindFusion.Diagramming.Diagram.RegisterItemClass(typeof(IconNode), "IconNode", 1);
            
            // Let users draw IconNode objects
            diagramView1.CustomNodeType = typeof(IconNode);
            diagramView1.Behavior = Behavior.Custom;
            //start Ирина (22.03.11)
            diagram1.ShapeHandlesStyle = HandlesStyle.Invisible;
            diagram2.ShowDisabledHandles = false;
            diagram2.Selection.Style = SelectionStyle.Frame;
            comboBox_Zoom.SelectedIndex = 3;
            //end Ирина (22.03.11)
        }

        public ClassSemanticNet SS = new ClassSemanticNet();
        public int Id = 0;
        //Саша-чтобы была возможность редактировать-сохраняем текущую вершину
        public ClassNode currentNode = null;
        public DiagramNode currentDNode = null;
/*
        private void открытьToolStripMenuItem_Click(object sender, EventArgs e)
        {
            //FileStream FStream=null;
            //try
            //{
            //    FStream = new FileStream("Структура", FileMode.Open, FileAccess.Read);
            //    XmlSerializer xmlSerializer = new XmlSerializer(typeof(List<ClassNode>),
            //    new Type[] { typeof(ClassNode) });
            //    //сериализация правил
            //    //ClassSemanticNet s = new ClassSemanticNet();
            //    //s.Add(SS);
            //    if (FStream.Length != 0)
            //        s = (ClassSemanticNet)xmlSerializer.Deserialize(FStream);
            //    MessageBox.Show("Сем.сеть загружена!", "Информация", MessageBoxButtons.OK,
            //        MessageBoxIcon.Information);
            //    MessageBox.Show(s.Count+s[0].Name);
            //}
            //catch
            //{
            //    MessageBox.Show("Невозможно загрузить из файла", "Ошибка", MessageBoxButtons.OK,
            //        MessageBoxIcon.Error);
            //}
            //finally
            //{
            //    if (FStream != null) FStream.Close();
            //}
        }

        private void сохранитьToolStripMenuItem_Click(object sender, EventArgs e)
        {
            
            //FileStream FStream = null;
            //try
            //{
            //    FStream = new FileStream("Структура", FileMode.Create, FileAccess.Write);
            //    XmlSerializer xmlSerializer = new XmlSerializer(typeof(List<ClassNode>),
            //    new Type[] { typeof(ClassNode) });
            //    //сериализация правил
            //    List<ClassNode> s = new List<ClassNode>();
            //    s.Add(SS);
            //    xmlSerializer.Serialize(FStream, s);
            //    MessageBox.Show("Сем.сеть сохранена!", "Информация", MessageBoxButtons.OK,
            //        MessageBoxIcon.Information);
            //}
            //catch
            //{
            //    MessageBox.Show("Невозможно сохранить в файл", "Ошибка", MessageBoxButtons.OK,
            //        MessageBoxIcon.Error);
            //}
            //finally
            //{
            //    if (FStream != null) FStream.Close();
            //}
        }
        */

        private void diagram1_LinkCreated(object sender, MindFusion.Diagramming.LinkEventArgs e)
        {
           /*MindFusion.Diagramming.DiagramNode node_in=null, node_out=null;
            foreach (MindFusion.Diagramming.DiagramNode nod in diagram1.Nodes)
            {
                if (nod.IncomingLinks.Contains(e.Link))
                {
                    node_in = nod;
                }
                if (nod.OutgoingLinks.Contains(e.Link))
                {
                    node_out = nod;
                }

            }
            ClassNode nod_in=SS.LstNodes.Find(delegate(ClassNode node)
            {
                if (node==(ClassNode)node_in.Id)
                    return true;
                else return false;
            });//(ClassNode )node_in.Id
            ClassNode nod_out = SS.LstNodes.Find(delegate(ClassNode node)
            {
                if (node == (ClassNode)node_out.Id)
                    return true;
                else return false;
            });
            nod_in.LstParent.Add(nod_out);
            nod_out.LstNodes.Add(nod_in);

            //if (e.Link.HeadShape==e.Link.BaseShape)
            //e.Link.AllowMoveEnd Id="Связь";*/

            //start от Ирины//
            ClassNode node1, node2, curnode;
            
            textBoxLegend.Text = "Идёт создание ссылки";
            node1 = (ClassNode)e.Link.Origin.Id;
            node2 = (ClassNode)e.Link.Destination.Id;
            curnode = node1;
            if (AllParent(curnode, node2))
            {
                MessageBox.Show("Зацикливание!!!");
                diagram1.Links.Remove(e.Link);
            }
            //end от Ирины//
            else
            {
                ((ClassNode)e.Link.Origin.Id).LstNodes.Add((ClassNode)e.Link.Destination.Id);
                ((ClassNode)e.Link.Destination.Id).LstParent.Add((ClassNode)e.Link.Origin.Id);
                e.Link.AllowMoveEnd = false;
                e.Link.AllowMoveStart = false;
                //Саша-сделать надпись над ссылкой-очерёдность 2.04
                e.Link.TextStyle = LinkTextStyle.Center;
                int y = ((ClassNode)e.Link.Origin.Id).LstNodes.Count;
                e.Link.Text = "#" + y.ToString();
                //Саша-конец 2.04
                //Саша-проверка того, что дуга выходит не из вершины-действия
                if (node1.TypeN == TypeNode.Action)
                {
                    MessageBox.Show("Действия ни на что не ссылаются!");
                    diagram1.Links.Remove(e.Link);

                }
                //start Ирина (22.03.11)
                else
                {
                    DiagramLink link_d2 = new DiagramLink(diagram2, GetShapeNodeById(node1), GetShapeNodeById(node2));
                    e.Link.Id = link_d2;
                    link_d2.ShadowOffsetX = link_d2.ShadowOffsetY = 0;
                    diagram2.Links.Add(link_d2);
                }
                //end Ирина (22.03.11)
            }
            SS.IsSaved = false;
            //MessageBox.Show(e.Link.AllowMoveEnd.ToString());


        }
        //start от Ирины//
        //---------------------функция проверки на отсутствие цикличности----------------------//
        private bool AllParent(ClassNode curnode, ClassNode lastnode)
        {
            bool result = false;
            if (curnode == lastnode)
                return true;
            foreach (var item in curnode.LstParent)
            {
                result = AllParent(item, lastnode);
            }
            return result;
        }
        //end от Ирины//
        private void diagram1_NodeSelected(object sender, MindFusion.Diagramming.NodeEventArgs e)
        {
            //start от Ирины//
            lstStatus.Items.Clear();
            lstStatus.Items.Add("Просмотр сети...");
            //end от Ирины//
            //Саша-сохранение выделенной вершины
            currentNode = (ClassNode)e.Node.Id;
            currentDNode = e.Node;
            if (((ClassNode)e.Node.Id).TypeN == TypeNode.Action)
            {
                lstViewContent.Items.Clear();
                textBoxLegend.Text = "Идёт просмотр действия";
                lstViewContent.Items.Add("Действие:");
                lstViewContent.Items.Add("Агент "+((ClassNode)e.Node.Id).CaseFrame.Agent.Name);
                lstViewContent.Items.Add("Реципиент " + ((ClassNode)e.Node.Id).CaseFrame.Recipient.Name);
                lstViewContent.Items.Add("Действие " + ((ClassNode)e.Node.Id).CaseFrame.ToDo.Name);
                lstViewContent.Items.Add("Место " + ((ClassNode)e.Node.Id).CaseFrame.Lokotiv.Name);
                lstViewContent.Items.Add("Время " + ((ClassNode)e.Node.Id).CaseFrame.Time.Name);
                lstViewContent.Items.Add("Объект " + ((ClassNode)e.Node.Id).CaseFrame.Obj.Name);
            }
            else
            {
                lstViewContent.Items.Clear();
                textBoxLegend.Text = "Идёт просмотр сцены";
                lstViewContent.Items.Add("Сцена:");
                lstViewContent.Items.Add("Название " + ((ClassNode)e.Node.Id).Name);
            }
            SS.IsSaved = false;
        }

        private void diagram1_Clicked(object sender, MindFusion.Diagramming.DiagramEventArgs e)
        {
            //start от Ирины//
            lstStatus.Items.Clear();
            textBoxLegend.Text = "Идёт создание новой вершины";
            lstStatus.Items.Add("Создание новой вершины...");
            //end от Ирины//
            //Саша-в форму передаём ещё несколько параметров
            AddChangeNode form1 = new AddChangeNode(this, false, currentNode,currentDNode, e.MousePosition.X, e.MousePosition.Y);
            form1.Tag = SS;
            //Саша-чтобы форма появлялась рядом с кликом 2.04
            int xx = (int)Math.Round((decimal)Cursor.Position.X);
            int yy = (int)Math.Round((decimal)Cursor.Position.Y);
            Point pp = new Point(xx, yy);
            form1.Location = pp;
            //Саша-конец 2.04
            form1.ShowDialog();
            //if (form1.DialogResult == DialogResult.Cancel)
                //diagram1.Nodes.Remove(iconNode);
            
            if (form1.DialogResult == DialogResult.OK)
            {
                IconNode iconNode;
                if (SS.LstNodes[SS.LstNodes.Count - 1].TypeN == TypeNode.Scene)
                {
                    iconNode = new IconNode(diagram1, Color.Red); 
                    iconNode.ToolTip="Сцена-"+SS.LstNodes[SS.LstNodes.Count - 1].Name.ToString();
                }
                else
                {
                    iconNode = new IconNode(diagram1, Color.Green);
                    iconNode.ToolTip = "Действие-"+SS.LstNodes[SS.LstNodes.Count - 1].CaseFrame.ToDo.Name.ToString();
                }
                diagram1.Nodes.Add(iconNode);
                iconNode.Move(e.MousePosition.X, e.MousePosition.Y);
                iconNode.Id = SS.LstNodes[SS.LstNodes.Count - 1];
                //start Ирина (22.03.11)
                SS.LstNodes[SS.LstNodes.Count - 1].X = SS.LstNodes[SS.LstNodes.Count - 1].X_d2 = e.MousePosition.X;
                SS.LstNodes[SS.LstNodes.Count - 1].Y = SS.LstNodes[SS.LstNodes.Count - 1].Y_d2 = e.MousePosition.Y;
                //на вторую диаграмму
                Add_to_LookDiagram(SS.LstNodes[SS.LstNodes.Count - 1]);
                //end Ирина (22.03.11)
                iconNode.TextColor = Color.Black;
                

            }
            //start от Ирины//
            lstStatus.Items.Clear();
            textBoxLegend.Text = "Просмотр сети";
            lstStatus.Items.Add("Просмотр сети...");
            SS.IsSaved = false;
            //end от Ирины//
        }
        //start Ирина (22.03.11)
        private void Add_to_LookDiagram(ClassNode node)
        {
            float x = node.X_d2, y = node.Y_d2;
            ShapeNode item = new ShapeNode(diagram2);
            ShapeNode item_case;
            DiagramLink link;
            item.Id = node;
            item.Bounds = new RectangleF(x, y, 10, 5);
            item.Shape = Shapes.Rectangle;
            item.Text = node.Name;
            item.Brush = new MindFusion.Drawing.SolidBrush(Color.BlueViolet);
            item.ShadowOffsetX = item.ShadowOffsetY = 0;
            diagram2.Nodes.Add(item);
            if (node.TypeN == TypeNode.Action)
            {
                List<ClassCase> allcase = new List<ClassCase>() { node.CaseFrame.Agent, node.CaseFrame.Recipient, 
                    node.CaseFrame.ToDo, node.CaseFrame.Lokotiv, node.CaseFrame.Obj, node.CaseFrame.Time};
                List<string> allcaseName = new List<string>() { "#агент", "#реципиент", "#действие", "#локотив",
                    "#объект", "#время"};
                int i = 0;
                foreach (ClassCase clcase in allcase)
                {
                    if (clcase.Name.Trim() != "")
                    {
                        item_case = new ShapeNode(diagram2);
                        item_case.Id = clcase;
                        item_case.Bounds = new RectangleF(clcase.X_d2, clcase.Y_d2, 10, 5);
                        item_case.Shape = Shapes.Ellipse;
                        item_case.Text = clcase.Name.Trim();
                        item_case.Brush = new MindFusion.Drawing.SolidBrush(Color.CadetBlue);
                        item_case.ShadowOffsetX = item_case.ShadowOffsetY = 0;
                        diagram2.Nodes.Add(item_case);
                        link = new DiagramLink(diagram2, item, item_case);
                        link.Text = allcaseName.ElementAt<string>(i);
                        link.AllowMoveEnd = link.AllowMoveStart = false;
                        link.ShadowOffsetX = link.ShadowOffsetY = 0;
                        diagram2.Links.Add(link);
                        i++;
                    }
                }
            }
        }
        //end Ирина (22.03.11)
        //Саша-при удалении дуги-убираем потомка и убираем родителя
        //при удалении вершины сначала удаляется связь-если она есть, а потом сама вершина
        private void diagram1_LinkDeleted(object sender, LinkEventArgs e)
        {
            textBoxLegend.Text = "";
            ((ClassNode)e.Link.Origin.Id).LstNodes.Remove((ClassNode)e.Link.Destination.Id);
            ((ClassNode)e.Link.Destination.Id).LstParent.Remove((ClassNode)e.Link.Origin.Id);
            //start Ирина (22.03.11)
            diagram2.Links.Remove((DiagramLink)e.Link.Id);
            //end Ирина (22.03.11)
            SS.IsSaved = false;
        }
        //Саша-при удалении вершины она автоматически не удаляется из семсети-поэтому возникало исключение!!
        private void diagram1_NodeDeleted(object sender, NodeEventArgs e)
        {
            textBoxLegend.Text = "";
            //start Ирина (22.03.11)
            ShapeNode Shnode = GetShapeNodeById((ClassNode)e.Node.Id);
            DiagramLinkCollection allLink = Shnode.GetAllLinks();
            foreach (DiagramLink item in allLink)
            {
                diagram2.Nodes.Remove(item.Destination);
                diagram2.Links.Remove(item);
            }
            diagram2.Nodes.Remove(Shnode);
            //end Ирина (22.03.11)
            SS.LstNodes.Remove((ClassNode)e.Node.Id);
            SS.IsSaved = false;
        }

        private void генерироватьТекстToolStripMenuItem2_Click(object sender, EventArgs e)
        {
            textBoxLegend.Text = "";
            bool error = false;
            bool exist = false;
            ClassNode CurNode;
            ClassNode StartNode = new ClassNode();
            lstStatus.Items.Clear();
            //start от Ирины//
            lstStatus.ForeColor = Color.Red;
            //end от Ирины//
            foreach (DiagramNode item in diagram1.Nodes)
            {
                if (((ClassNode)item.Id).TypeN == TypeNode.Scene)
                    ((IconNode)item).ColOfNode = Color.Red;
                else
                    ((IconNode)item).ColOfNode = Color.Green;
            }
            foreach (DiagramNode item in diagram1.Nodes)
            {
                CurNode = (ClassNode)item.Id;
                if (CurNode.TypeN == TypeNode.Scene)
                {
                    if (CurNode.LstNodes.Count == 0)
                    {
                        lstStatus.Items.Add("Сцена с именем " + CurNode.Name + " не ссылается на действия.");
                        IconNode fg = (IconNode)item;
                        fg.ColOfNode = Color.HotPink;
                        error = true;
                    }
                    if (CurNode.LstParent.Count == 0)
                        if (!exist)
                        {
                            StartNode = CurNode;
                            exist = true;
                        }
                        else
                        {
                            lstStatus.Items.Add("Сцена с именем " + CurNode.Name + " не связана с сетью.");
                            IconNode fg = (IconNode)item;
                            fg.ColOfNode = Color.HotPink;
                            error = true;
                        }
                }
                else
                    if (CurNode.LstParent.Count == 0)
                    {
                        lstStatus.Items.Add("На действие " + CurNode.CaseFrame.ToDo.Name + " не ссылаются сцены.");
                        IconNode fg = (IconNode)item;
                        fg.ColOfNode = Color.LawnGreen;
                        error = true;
                    }
            }
            if (error)
            {
                MessageBox.Show("Сеть заполнена некорректно!!!");
                diagramView1.Refresh();
                return;
            }
            else
                lstStatus.Items.Add("Ошибок нет...");
            lstStatus.ForeColor = Color.Black;
            MLV myMLV = new MLV(StartNode);
            myMLV.GoRoundOfScene(StartNode.Name);
            txtFairyTale.Text = myMLV.Fairytale;
            txtFairyTale.SelectionStart = 0;
            txtFairyTale.SelectionLength = 0;
            tabControl1.SelectedIndex = 1;
        }
        //Саша-чтобы правильно появлялось окно, если по кнопке кликаем 3.04
        bool is_Redact_context = false;
        //Саша-каонец 3.04
        //Саша-кнопка редактирования-хотя в name-btnedit
        private void button1_Click(object sender, EventArgs e)
        {
            //Саша-проверка, что редактирование идёт последней выделенной вершины 2.04
            if (currentNode != null)
                //Саша-еонец-ещё там скобочка вконце 2.04
            {
                lstViewContent.Items.Clear();
                AddChangeNode form1 = new AddChangeNode(this, true, currentNode, currentDNode, currentNode.X_d2, currentNode.Y_d2);
                form1.Tag = SS;
                //Саша-чтобы форма появлялась рядом с кликом 2.04
                if (is_Redact_context)
                {
                    int xx = (int)Math.Round((decimal)Cursor.Position.X);
                    int yy = (int)Math.Round((decimal)Cursor.Position.Y);
                    Point pp = new Point(xx, yy);
                    form1.Location = pp;
                }
                else
                    form1.StartPosition = FormStartPosition.CenterScreen;
                //Саша-конец 2.04
                form1.ShowDialog();

                if (form1.DialogResult == DialogResult.OK)
                {
                    lstViewContent.Items.Clear();
                    if (currentNode.TypeN == TypeNode.Action)
                    {
                        lstViewContent.Items.Clear();
                        lstViewContent.Items.Add("Агент " + currentNode.CaseFrame.Agent.Name);
                        lstViewContent.Items.Add("Реципиент " + currentNode.CaseFrame.Recipient.Name);
                        lstViewContent.Items.Add("Действие " + currentNode.CaseFrame.ToDo.Name);
                        lstViewContent.Items.Add("Место " + currentNode.CaseFrame.Lokotiv.Name);
                        lstViewContent.Items.Add("Время " + currentNode.CaseFrame.Time.Name);
                        lstViewContent.Items.Add("Объект " + currentNode.CaseFrame.Obj.Name);
                    }
                    else
                    {
                        lstViewContent.Items.Clear();
                        lstViewContent.Items.Add("Название " + currentNode.Name);
                    }
                }
            }
        }

        //------------------------бинарная сериализация в файл--------------------------------------------------------------------
        private bool SerializeToFile(string nameOfFile)
        {
            try
            {
                var bFormat = new BinaryFormatter();
                var fStream = new FileStream(nameOfFile, FileMode.Create);
                var lst = new List<ClassSemanticNet> { SS };
                bFormat.Serialize(fStream, lst);
                fStream.Close();
                SS.IsSaved = true;
                return true;
            }
            catch
            {
                MessageBox.Show("Произошла ошибка при сохранении файла", "Внимание!", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            return false;
        }

        private bool SerializeFromFile(string nameOfFile)
        {
            try
            {
                var bFormat = new BinaryFormatter();
                var fStream = new FileStream(nameOfFile, FileMode.Open);
                SS = ((List<ClassSemanticNet>)bFormat.Deserialize(fStream))[0];
                fStream.Close();
                VisualFromStructure();
            }
            catch
            {
                MessageBox.Show("Произошла ошибка при сохранении файла", "Внимание!", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            return false;
        }

        private void сохранитьToolStripMenuItem_Click(object sender, EventArgs e)
        {
            if (SS.FileName == "")
                сохранитьКакToolStripMenuItem_Click(sender,e);
            else SerializeToFile(SS.FileName);
            SS.IsSaved = true;
        }

        private void сохранитьКакToolStripMenuItem_Click(object sender, EventArgs e)
        {
            SaveFileDialog sfd = new SaveFileDialog { Filter = @"Семантическая сеть|*.sn" };
            if (sfd.ShowDialog() == DialogResult.OK)
                SS.FileName = sfd.FileName;
            else return;
            SerializeToFile(SS.FileName);
            SS.IsSaved = true;
        }

        private void открытьToolStripMenuItem_Click(object sender, EventArgs e)
        {
            if (!SS.IsSaved)
            {
                DialogResult IsClaimSave=MessageBox.Show("Сохранить текущую семантическую сеть?", "Внимание!",
                    MessageBoxButtons.YesNo, MessageBoxIcon.Information);
                if (IsClaimSave == DialogResult.Yes)
                {
                    if (SS.FileName == "")
                    {
                        SaveFileDialog sfd = new SaveFileDialog { Filter = @"Семантическая сеть|*.sn" };
                        if (sfd.ShowDialog() == DialogResult.OK)
                            SS.FileName = sfd.FileName;
                        else return;
                    }
                    if (!SerializeToFile(SS.FileName))
                        return;//произошла ошибка при сериализации=>отменяем всю операцию
                }
            }
            SS.Clear();
            OpenFileDialog ofdial = new OpenFileDialog { Filter = @"Семантическая сеть|*.sn" };
            if (ofdial.ShowDialog() == DialogResult.OK)
                SS.FileName = ofdial.FileName;
            else return;
            SerializeFromFile(SS.FileName);
            SS.IsSaved = true;
        }
        //========================бинарная сериализация в файл=======================================================================

        //------------------------Создание новой сем.сети----------------------------------------------------------------------------
        private void создатьToolStripMenuItem_Click(object sender, EventArgs e)
        {
            if (!SS.IsSaved)
            {
                DialogResult IsClaimSave = MessageBox.Show("Сохранить текущую семантическую сеть?", "Внимание!",
                    MessageBoxButtons.YesNo, MessageBoxIcon.Information);
                if (IsClaimSave == DialogResult.Yes)
                {
                    if (SS.FileName == "")
                    {
                        SaveFileDialog sfd = new SaveFileDialog { Filter = @"Семантическая сеть|*.sn" };
                        if (sfd.ShowDialog() == DialogResult.OK)
                            SS.FileName = sfd.FileName;
                        else return;
                    }
                    if (!SerializeToFile(SS.FileName))
                        return;//произошла ошибка при сериализации=>отменяем всю операцию
                }
            }
            SS.Clear();
            VisualFromStructure();
            SS.IsSaved = true;
        }
        //========================Создание новой сем.сети============================================================================

        //------------------------Загрузка информации из структуры сем.сети на форму-------------------------------------------------
        private IconNode GetIconNodeById(ClassNode Node)
        {
            foreach(IconNode IcNode in diagram1.Nodes)
            {
                if (IcNode.Id==Node)
                    return IcNode;
            }
            return null;
        }
        //start Ирина (22.03.11)
        public ShapeNode GetShapeNodeById(ClassNode Node)
        {
            foreach (ShapeNode ShNode in diagram2.Nodes)
            {
                if (ShNode.Id == Node)
                    return ShNode;
            }
            return null;
        }
        //end Ирина (22.03.11)
        private void VisualFromStructure()
        {
            txtFairyTale.Text = "";
            lstStatus.Items.Clear();
            lstViewContent.Items.Clear();
            diagram1.Nodes.Clear();
            diagram1.Links.Clear();
            float x = 20;
            float y = 20;
            foreach (ClassNode node in SS.LstNodes)
            {
                IconNode iconNode;
                if (node.TypeN == TypeNode.Scene)
                    iconNode = new IconNode(diagram1, Color.Red);
                else iconNode = new IconNode(diagram1, Color.Green);
                diagram1.Nodes.Add(iconNode);
                //start Ирина (22.03.11)
                x = node.X;
                y = node.Y;
                //end Ирина (22.03.11)
                iconNode.Move(x, y);
                iconNode.Id = node;
               
                //start Ирина (22.03.11)
                Add_to_LookDiagram(node);
                //end Ирина (22.03.11)
                //x = x == y ? x + 20 : x;
                //y = y+10;
            }
            foreach (ClassNode node in SS.LstNodes)
            {
                if (node.TypeN == TypeNode.Scene)
                {
                    foreach(ClassNode child in node.LstNodes)
                    {
                        DiagramLink newLink=new DiagramLink(diagram1,GetIconNodeById(node),GetIconNodeById(child));
                        newLink.AllowMoveEnd = false;
                        newLink.AllowMoveStart = false;
                        diagram1.Links.Add(newLink);
                        //start Ирина (22.03.11)
                        DiagramLink link_d2 = new DiagramLink(diagram2, GetShapeNodeById(node), GetShapeNodeById(child));
                        newLink.Id = link_d2;
                        link_d2.ShadowOffsetX = link_d2.ShadowOffsetY = 0;
                        diagram2.Links.Add(link_d2);
                        //end Ирина (22.03.11)
                    }
                }
            }
            diagramView1.Refresh();
        }
        //========================Загрузка информации из структуры сем.сети на форму=================================================
        //------------------------Выход из формы-------------------------------------------------------------------------------------
        private void выходToolStripMenuItem_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        private void frmMain_FormClosing(object sender, FormClosingEventArgs e)
        {
            if (!SS.IsSaved)
            {
                DialogResult IsClaimSave = MessageBox.Show("Сохранить текущую семантическую сеть?", "Внимание!",
                    MessageBoxButtons.YesNo, MessageBoxIcon.Information);
                if (IsClaimSave == DialogResult.Yes)
                {
                    if (SS.FileName == "")
                    {
                        SaveFileDialog sfd = new SaveFileDialog { Filter = @"Семантическая сеть|*.sn" };
                        if (sfd.ShowDialog() == DialogResult.OK)
                            SS.FileName = sfd.FileName;
                        else
                        {
                            e.Cancel = true;
                            return;
                        }
                    }
                    if (!SerializeToFile(SS.FileName))
                    {
                        e.Cancel = true;
                        return;//произошла ошибка при сериализации=>отменяем всю операцию
                    }
                }
            }
            if (MessageBox.Show("Вы действительно хотите выйти?", "Внимание!",
                MessageBoxButtons.YesNo, MessageBoxIcon.Information) != DialogResult.Yes)
                e.Cancel = true;//отмена события выхода
        }
        //========================Выход из формы=====================================================================================

        //------------------------XML сериализация в файл----------------------------------------------------------------------------
        private void SerializeToXMLFile(string NameOfFile)
        {
            FileStream FStream = null;
            try
            {
                FStream = new FileStream(NameOfFile, FileMode.Create, FileAccess.Write);
                XmlSerializer xmlSerializer = new XmlSerializer(typeof(List<ClassSemanticNet>)/*, new Type[] { typeof(ClassSemanticNet), typeof(List<ClassNode>), typeof(List<ClassNode>), typeof(List<ClassNode>) }*/);
                List<ClassSemanticNet> s = new List<ClassSemanticNet>();
                s.Add(SS);
                xmlSerializer.Serialize(FStream, s);
                MessageBox.Show("Сем.сеть сохранена в XML!", "Информация", MessageBoxButtons.OK,MessageBoxIcon.Information);
            }
            catch
            {
                MessageBox.Show("Невозможно сохранить в файл", "Ошибка", MessageBoxButtons.OK,MessageBoxIcon.Error);
            }
            finally
            {
                if (FStream != null) FStream.Close();
            }
        }
        private void SerializeFromXMLFile(string NameOfFile)
        {
            FileStream FStream = null;
            try
            {
                FStream = new FileStream(NameOfFile, FileMode.Open, FileAccess.Read);
                XmlSerializer xmlSerializer = new XmlSerializer(typeof(List<ClassSemanticNet>),new Type[] { typeof(ClassNode) });
                List<ClassSemanticNet> s = new List<ClassSemanticNet>();
                if (FStream.Length != 0)
                    s = (List<ClassSemanticNet>)xmlSerializer.Deserialize(FStream);
                SS = s[0];
                MessageBox.Show("Сем.сеть загружена!", "Информация", MessageBoxButtons.OK,MessageBoxIcon.Information);
            }
            catch
            {
                MessageBox.Show("Невозможно загрузить из файла", "Ошибка", MessageBoxButtons.OK,MessageBoxIcon.Error);
            }
            finally
            {
                if (FStream != null) FStream.Close();
            }
        }

        private void сохранитьВXMLToolStripMenuItem_Click(object sender, EventArgs e)
        {
            SaveFileDialog sfd = new SaveFileDialog { Filter = @"XML файлы|*.xml" };
            string str = "";
            if (sfd.ShowDialog() == DialogResult.OK)
                str = sfd.FileName;
            else return;
            SerializeToXMLFile(str);
        }

        private void загрузитьИзXMLToolStripMenuItem_Click(object sender, EventArgs e)
        {
            if (!SS.IsSaved)
            {
                DialogResult IsClaimSave = MessageBox.Show("Сохранить текущую семантическую сеть?", "Внимание!",
                    MessageBoxButtons.YesNo, MessageBoxIcon.Information);
                if (IsClaimSave == DialogResult.Yes)
                {
                    if (SS.FileName == "")
                    {
                        SaveFileDialog sfd = new SaveFileDialog { Filter = @"Семантическая сеть|*.sn" };
                        if (sfd.ShowDialog() == DialogResult.OK)
                            SS.FileName = sfd.FileName;
                        else return;
                    }
                    if (!SerializeToFile(SS.FileName))
                        return;//произошла ошибка при сериализации=>отменяем всю операцию
                }
            }
            SS.Clear();
            OpenFileDialog ofdial = new OpenFileDialog { Filter = @"XML файлы|*.xml" };
            string str = "";
            if (ofdial.ShowDialog() == DialogResult.OK)
                str = ofdial.FileName;
            else return;
            SerializeFromXMLFile(str);
            VisualFromStructure();
        }

        //Саша-чтобы нельзя было изменять размер
        private void diagram1_NodeModified(object sender, NodeEventArgs e)
        {            
            e.Node.Resize(5,5);
            //start Ирина (22.03.11)
            ((ClassNode)e.Node.Id).X = e.MousePosition.X;
            ((ClassNode)e.Node.Id).Y = e.MousePosition.Y;
            //end Ирина (22.03.11)
        }

        //start Ирина (22.03.11)
        private void comboBox_Zoom_SelectedIndexChanged(object sender, EventArgs e)
        {
            short[] zooms = new short[] { 25, 50, 75, 100, 125, 150, 175, 200 };

            if (comboBox_Zoom.SelectedIndex == -1)
                return;

            diagramView2.ZoomFactor = zooms[comboBox_Zoom.SelectedIndex];
        }
        private void diagram2_NodeModified(object sender, NodeEventArgs e)
        {
            try
            {
                ((ClassNode)e.Node.Id).X_d2 = e.MousePosition.X;
                ((ClassNode)e.Node.Id).Y_d2 = e.MousePosition.Y;
            }
            catch (InvalidCastException)
            {
                ((ClassCase)e.Node.Id).X_d2 = e.MousePosition.X;
                ((ClassCase)e.Node.Id).Y_d2 = e.MousePosition.Y;
            }
            SS.IsSaved = false;
        }
        //end Ирина (22.03.11)

        private void diagram1_LinkDeselected(object sender, LinkEventArgs e)
        {
            lstViewContent.Items.Clear();
            textBoxLegend.Text = "";
        }

        private void diagram1_LinkSelected(object sender, LinkEventArgs e)
        {
            textBoxLegend.Text = "Выбрана связь";
            lstViewContent.Items.Clear();
            ClassNode n1 = (ClassNode)e.Link.Origin.Id;
            ClassNode n2 = (ClassNode)e.Link.Destination.Id;
            
            if (n1.TypeN == TypeNode.Action)
            {
                lstViewContent.Items.Add("Дуга исходит из действия" );
                   lstViewContent.Items.Add( n1.CaseFrame.ToDo.Name.ToString());
            }
            else
            {
                lstViewContent.Items.Add("Дуга исходит из сцены" );
            lstViewContent.Items.Add(n1.Name.ToString());
            }
            if (n2.TypeN == TypeNode.Action)
            {
                lstViewContent.Items.Add("Дуга входит в действие");
                lstViewContent.Items.Add(n2.CaseFrame.ToDo.Name.ToString());
            }
            else
            {
                lstViewContent.Items.Add("Дуга входит в сцену");
                lstViewContent.Items.Add(n2.Name.ToString());
            }
        }

     
        private void diagram1_NodeClicked(object sender, NodeEventArgs e)
        {
            if (e.MouseButton == MouseButton.Right)
            {
                
                //ContextMenuStrip ct = new System.Windows.Forms.ContextMenuStrip();
                //ct.Items.Add("Редактировать");
                currentNode = (ClassNode)e.Node.Id;
                currentDNode = e.Node;
                if (((ClassNode)e.Node.Id).TypeN == TypeNode.Action)
                {
                    lstViewContent.Items.Clear();
                    textBoxLegend.Text = "Идёт просмотр действия";
                    lstViewContent.Items.Add("Действие:");
                    lstViewContent.Items.Add("Агент " + ((ClassNode)e.Node.Id).CaseFrame.Agent.Name);
                    lstViewContent.Items.Add("Реципиент " + ((ClassNode)e.Node.Id).CaseFrame.Recipient.Name);
                    lstViewContent.Items.Add("Действие " + ((ClassNode)e.Node.Id).CaseFrame.ToDo.Name);
                    lstViewContent.Items.Add("Место " + ((ClassNode)e.Node.Id).CaseFrame.Lokotiv.Name);
                    lstViewContent.Items.Add("Время " + ((ClassNode)e.Node.Id).CaseFrame.Time.Name);
                    lstViewContent.Items.Add("Объект " + ((ClassNode)e.Node.Id).CaseFrame.Obj.Name);
                }
                else
                {
                    lstViewContent.Items.Clear();
                    textBoxLegend.Text = "Идёт просмотр сцены";
                    lstViewContent.Items.Add("Сцена:");
                    lstViewContent.Items.Add("Название " + ((ClassNode)e.Node.Id).Name);
                }
                int x = (int)Math.Round((decimal)Cursor.Position.X);
                int y = (int)Math.Round((decimal)Cursor.Position.Y);
                Point p = new Point(x, y);
               // ct.Show(p);
              contextMenuStripNode.Show(p);
            }
        }
        
        private void редактироватьToolStripMenuItem_Click(object sender, EventArgs e)
        {
            //Саша-правильное позиционирование экрана 3.04
            is_Redact_context = true;
            button1_Click(new object(), null);
            is_Redact_context = false;
            //Саша-конец 3.04
        }

        private void comboBox_Zoom_SelectedIndexChanged_1(object sender, EventArgs e)
        {
            short[] zooms = new short[] { 25, 50, 75, 100, 125, 150, 175, 200 };

            if (comboBox_Zoom.SelectedIndex == -1)
                return;

            diagramView2.ZoomFactor = zooms[comboBox_Zoom.SelectedIndex];
        }

        private void diagram1_LinkClicked(object sender, LinkEventArgs e)
        {
            if (e.MouseButton == MouseButton.Right)
            {
                
                int x = (int)Math.Round((decimal)Cursor.Position.X);
                int y = (int)Math.Round((decimal)Cursor.Position.Y);
                Point p = new Point(x, y);
                // ct.Show(p);
                contextMenuStripLink.Show(p);
            }
        }

        private void изменитьПорядокToolStripMenuItem_Click(object sender, EventArgs e)
        {

        }
        
        //========================XML сериализация в файл============================================================================


        /*private void button1_Click(object sender, EventArgs e)
        {
            button1.Enabled = false;
            MLV myMLV= new MLV();
            myMLV.MainScene = SS;
            myMLV.GoRoundOfScene(SS.Name);
            textBox1.Text = myMLV.Fairytale;
        }

        private void button2_Click(object sender, EventArgs e)
        {
            button2.Enabled = false;
            button1.Enabled = true;
            List<ClassNode> lst = new List<ClassNode>();
            lst.Add(new ClassNode(TypeNode.Action));
            lst[lst.Count - 1].Name = "1";
            lst[lst.Count - 1].CaseFrame = new ClassCaseFrame();
            lst[lst.Count - 1].CaseFrame.Agent = new ClassCase();
            lst[lst.Count - 1].CaseFrame.Agent.Name = "царь и сыновья";
            lst[lst.Count - 1].CaseFrame.Lokotiv = new ClassCase();
            lst[lst.Count - 1].CaseFrame.Lokotiv.Name = "во дворце";
            lst[lst.Count - 1].CaseFrame.ToDo = new ClassCase();
            lst[lst.Count - 1].CaseFrame.ToDo.Name = "жили-поживали";
            lst[lst.Count - 1].CaseFrame.Time = new ClassCase();
            lst[lst.Count - 1].CaseFrame.Time.Name = "многие лета назад";
            lst.Add(new ClassNode(TypeNode.Action));
            lst[lst.Count - 1].Name = "2";
            lst[lst.Count - 1].CaseFrame = new ClassCaseFrame();
            lst[lst.Count - 1].CaseFrame.Agent = new ClassCase();
            lst[lst.Count - 1].CaseFrame.Agent.Name = "три сына";
            lst[lst.Count - 1].CaseFrame.Recipient = new ClassCase();
            lst[lst.Count - 1].CaseFrame.Recipient.Name = "у него";
            lst[lst.Count - 1].CaseFrame.ToDo = new ClassCase();
            lst[lst.Count - 1].CaseFrame.ToDo.Name = "было";
            SS = new ClassNode(TypeNode.Scene);
            SS.Name = "Пролог";
            SS.LstNodes = lst;

            listBox1.Items.Clear();
            listBox1.Items.Add(SS.Name+"__"+SS.TypeN.ToString());
            listBox1.Items.Add(SS.LstNodes[0].Name + "__" + SS.LstNodes[0].TypeN.ToString());
            listBox1.Items.Add(SS.LstNodes[1].Name + "__" + SS.LstNodes[1].TypeN.ToString());
        }*/
    }
}
